Go 言語の開発において、データベース操作はすべての開発者が避けられないトピックです。GORM は強力でデザインが優雅な ORM ライブラリとして、そのシンプルな API と豊富な機能により、Go 開発者の第一選択のツールとなっています。初心者でもベテランでも、GORM の API をマスターすることで、開発効率を数倍向上させることができます!
今日は、GORM のすべてのコア API を深く探求し、入門から上級まで、GORM の秘密を完全にマスターする手助けをします!
なぜ GORM を選ぶのか?#
GORM は単なる ORM ツールではなく、データベース操作のスイスアーミーナイフのようなものです。以下は GORM のコアの利点です:
- シンプルな API 設計:チェーン呼び出しで、コードが明確で読みやすい。
- 強力な機能サポート:CRUD、トランザクション、フック、プリロードなどの高度な機能をサポート。
- 多様なデータベースサポート:MySQL、PostgreSQL、SQLite、SQL Server などの主要なデータベース。
- 活発なコミュニティ:豊富なドキュメントとコミュニティサポートで、問題解決が迅速。
次に、初期化、モデル定義、CRUD 操作、高度な機能の 4 つの側面から、GORM の API を包括的に解析します!
1. 初期化と設定#
1.1 データベースに接続#
GORM は多様なデータベースをサポートしており、以下は MySQL に接続する例です:
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("データベース接続に失敗しました")
}
fmt.Println("データベースに接続されました!")
}
1.2 GORM の設定#
GORM はログレベル、テーブルプレフィックスなどの豊富な設定オプションを提供します:
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logger.Info), // ログレベルを設定
NamingStrategy: schema.NamingStrategy{
TablePrefix: "t_", // テーブルプレフィックス
},
})
2. モデル定義#
2.1 モデルの定義#
GORM は構造体を使用してモデルを定義し、各フィールドはタグ(Tag)を通じてデータベース制約を指定できます:
type User struct {
gorm.Model // gorm.Modelを埋め込む、ID、CreatedAt、UpdatedAt、DeletedAtを含む
Name string `gorm:"type:varchar(100);not null"`
Age int `gorm:"default:18"`
Email string `gorm:"uniqueIndex"`
}
2.2 自動マイグレーション#
GORM はモデルに基づいて自動的にテーブル構造を作成または更新できます:
db.AutoMigrate(&User{}) // usersテーブルを自動作成
3. CRUD 操作#
3.1 レコードの作成#
// 単一レコードを作成
user := User{Name: "John", Age: 20}
result := db.Create(&user) // *gorm.DBを返す
fmt.Println(user.ID) // 挿入された主キーを取得
// バッチ作成
users := []User{{Name: "Alice"}, {Name: "Bob"}}
db.Create(&users)
3.2 レコードのクエリ#
// 単一レコードをクエリ
var user User
db.First(&user, 1) // 主キーでクエリ
db.First(&user, "name = ?", "John") // 条件クエリ
// 複数レコードをクエリ
var users []User
db.Find(&users) // すべてのレコードをクエリ
db.Where("age > ?", 18).Find(&users) // 条件クエリ
// 特定のフィールドをクエリ
db.Select("name", "age").Find(&users)
// ソートとページネーション
db.Order("age desc").Limit(10).Offset(0).Find(&users)
3.3 レコードの更新#
// 単一レコードを更新
db.Model(&user).Update("Age", 21)
// 複数フィールドを更新
db.Model(&user).Updates(User{Name: "Alice", Age: 22})
// バッチ更新
db.Model(&User{}).Where("age < ?", 18).Update("age", 20)
3.4 レコードの削除#
// 単一レコードを削除
db.Delete(&user)
// 主キーで削除
db.Delete(&User{}, 1)
// バッチ削除
db.Where("age < ?", 18).Delete(&User{})
4. 高度な機能#
4.1 トランザクション処理#
GORM は手動および自動トランザクションをサポートします:
// 手動トランザクション
tx := db.Begin()
if err := tx.Create(&User{Name: "John"}).Error; err != nil {
tx.Rollback()
return
}
tx.Commit()
// 自動トランザクション
db.Transaction(func(tx *gorm.DB) error {
if err := tx.Create(&User{Name: "John"}).Error; err != nil {
return err
}
return nil
})
4.2 フック関数#
GORM はモデルライフサイクルフックを提供し、特定のタイミングでカスタムロジックを実行できます:
func (u *User) BeforeCreate(tx *gorm.DB) error {
u.CreatedAt = time.Now()
return nil
}
func (u *User) AfterDelete(tx *gorm.DB) error {
fmt.Println("ユーザーが削除されました:", u.ID)
return nil
}
4.3 プリロード(N+1 クエリ問題の解決)#
type Order struct {
gorm.Model
UserID uint
User User
}
var orders []Order
db.Preload("User").Find(&orders) // 関連するUserデータをプリロード
4.4 生 SQL#
GORM は生 SQL 文を実行することをサポートします:
var users []User
db.Raw("SELECT * FROM users WHERE age > ?", 18).Scan(&users)
db.Exec("UPDATE users SET age = ? WHERE name = ?", 20, "John")
5. 関連関係#
5.1 一対一#
type Profile struct {
gorm.Model
UserID uint
User User
}
type User struct {
gorm.Model
Profile Profile
}
5.2 一対多#
type Order struct {
gorm.Model
UserID uint
User User
}
type User struct {
gorm.Model
Orders []Order
}
5.3 多対多#
type User struct {
gorm.Model
Languages []Language `gorm:"many2many:user_languages;"`
}
type Language struct {
gorm.Model
Name string
Users []User `gorm:"many2many:user_languages;"`
}
6. その他の機能#
6.1 ソフトデリート#
GORM はソフトデリートをサポートし、レコードは実際には削除されず、DeletedAt フィールドが設定されます:
db.Delete(&user) // ソフトデリート
db.Unscoped().Delete(&user) // ハードデリート
6.2 カスタムテーブル名#
func (User) TableName() string {
return "custom_users"
}
まとめ#
GORM の API 設計はシンプルで強力であり、データベース操作のあらゆる側面をカバーしています。単純な CRUD 操作から複雑な関連クエリやトランザクション処理まで、GORM は簡単に対応できます。これらの API を熟知することで、開発効率を大幅に向上させ、より優雅で効率的な Go コードを書くことができます。
特定の機能についてさらに深く知りたい場合は、GORM 公式ドキュメントを参照して、詳細情報を取得してください。このガイドが GORM を完全にマスターし、データベース操作の究極の達人になる手助けとなることを願っています!
今すぐ GORM を試して、あなたの Go 言語開発を加速させましょう! 🚀
私の公式アカウント「全栈开发 ck」をフォローして、オリジナルの技術記事をいち早く受け取ってください。